#include <iostream>
using namespace std;

class Demo
{
public:
    virtual void func_1()
    {
        cout << "我是虚函数1" << endl;
    }
    virtual void func_2()
    {
        cout << "我是虚函数2" << endl;
    }
};

int main()
{
    // 程序运行到实例化对象的时候，会生成一个虚表（创建一个函数指针数组，长度为2）
    Demo d1;
    
    // d1的地址  等于  虚表的地址     想通过d1的地址找到虚表的地址    需要类型转换
    unsigned long long *virtual_list_addr = (unsigned long long *)&d1;
    
    // 虚表的地址进行解引用得到虚表，但是还得指针变量去存放虚表的地址
    unsigned long long *virtual_list = (unsigned long long *)*virtual_list_addr;

    // virtual_list 等于 首元素地址 进行解引用 得到首元素,首元素就是存放第一个虚函数的地址，函数名字可以表示函数的地址
    // 所以可以通过  虚表的地址 + 偏移量  来找到对应的虚函数

    ((void(*)())(*virtual_list))();
    ((void(*)())(*(virtual_list+1)))();

    
    return 0;
}